處理 Excel 檔案或其他數據資料時,缺失值 (Missing Value) 是常見的問題。這篇文章介紹什麼是缺失值,並介紹如何使用 Python 的 pandas 套件來處理這些缺失值。
缺失值是指在數據集中某些資料是空白、未填寫、無效或無法獲取的數據。這些缺失值可能是由於數據輸入錯誤、系統故障、或者是某些未完成的步驟而產生。
由於缺失值容易影響統計計算結果的準確性,或是造成圖表的錯誤或不完整,以及干擾數據模型的訓練與預測等等,所以需要特別處理缺失值以確保數據分析的品質及有效性。
Excel 常見的缺失值包括:
在 Python pandas 套件中,缺失值通常用 NaN
和 NaT
表示。NaN
(Not a Number) 表示缺失的數值數據,而 NaT
(Not a Time) 則表示缺失的時間數據。
NaN
是一個浮點數,專門用來表示缺失或無效的數值數據。在 pandas 中,NaN
是由 NumPy 套件中的 numpy.nan
表示。NaT
則是專門用來表示缺失的時間數據,通常在處理時間相關數據時會用到。在 pandas 中,可以使用 isna()
或 isnull()
方法來檢查 DataFrame 中的缺失值,這兩個方法都會同時識別 NaN
和 None
。
例如 example.xlsx 有以下資料:
order_id | create_date | order_quantity | unit_price |
---|---|---|---|
10000 | 80 | 1000 | |
2024/6/6 | 165 | ||
10002 | 2024/6/13 | 10 | 1200 |
下方是檢查缺失值的程式碼:
import pandas as pd
# 讀取 Excel 檔案
df = pd.read_excel('example.xlsx')
# 將 'create_date' 列轉換為 datetime 格式
df['create_date'] = pd.to_datetime(df['create_date'], errors='coerce')
# 使用 isna() 檢查缺失值
print("\n使用 isna() 檢查缺失值:")
print(df.isna())
# 使用 isnull() 檢查缺失值
print("\n使用 isnull() 檢查缺失值:")
print(df.isnull())
程式輸出結果:
使用 isna() 檢查缺失值:
order_id create_date order_quantity unit_price
0 False True False False
1 True False False True
2 False False False False
使用 isnull() 檢查缺失值:
order_id create_date order_quantity unit_price
0 False True False False
1 True False False True
2 False False False False
dropna()
方法可以移除包含缺失值的列或行。承接上面 example.xlsx 的資料,以下是 dropna()
的使用案例:
# 刪除包含任何缺失值的列
print("\n刪除包含任何缺失值的列:")
print(df.dropna())
程式輸出結果:
刪除包含任何缺失值的列:
order_id create_date order_quantity unit_price
2 10002.0 2024-06-13 10.0 1200.0
在這個例子中,dropna()
方法刪除了第 0 列和第 1 列,因為它們都包含至少一個缺失值。結果只保留了第 2 列。
fillna()
方法可以用指定的值或方法來填補缺失值。承接上面 example.xlsx 的資料,以下是 fillna()
的使用案例:
# 用指定的值填補缺失值
df_filled_value = df.fillna({
'create_date': '未提供', # 將 create_date 的缺失值填補為 '未提供'
'order_quantity': 0, # 將 order_quantity 的缺失值填補為 0
'unit_price': 0 # 將 unit_price 的缺失值填補為 0
})
print("\n用指定的值填補缺失值:")
print(df_filled_value)
程式輸出結果:
用指定的值填補缺失值:
order_id create_date order_quantity unit_price
0 10000.0 未提供 80 1000.0
1 NaN 2024-06-06 00:00:00 165 0.0
2 10002.0 2024-06-13 00:00:00 10 1200.0
除了指定的值,fillna()
也可以選擇使用平均值、中位數、前一個有效值、後一個有效值等替代缺失值。
在 Python 中,NaN
和 None
都可以表示缺失值,但它們有一些不同之處:
NaN
是一種特殊的浮點數,屬於 float
類型,專門用來表示缺失或無效的數值數據。它通常在數據分析和科學計算中使用。None
是 Python 的內建常數,屬於 NoneType
,表示缺少數據或空值。它可以用於任何數據類型,含有 None
的數據類型通常會變為 object
,這意味著它不再是數值類型。NaN
參與數學運算時,結果仍為 NaN
,且不會引錯誤。None
參與數學運算時會引發錯誤。import numpy as np
result = np.nan + 5 # 結果是 nan
result = None + 5 # 會引發 TypeError
NaN
和 NaT
用於表示缺失的數值數據和時間數據。isna()
和 isnull()
方法檢查 DataFrame 中的缺失值。NaN
和 None
都可以表示缺失值,但在數值計算中,NaN
不會引發錯誤,而 None
會。